package com.sjy.security;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.stereotype.Service;

import com.sjy.bean.Authority;
import com.sjy.dao.authdao;




@Service
public class MyInvocationSecurityMetadataSourceService implements
		FilterInvocationSecurityMetadataSource{

	@Autowired
	private authdao authdao;
	
	private Map<String , Collection<ConfigAttribute>> map=null;
	
	Collection<ConfigAttribute> a=new ArrayList<>();
	
	/*
	 * 系统启动后，首次有用户访问，加载权限表中所有权限。以便拦截无权放访问的用户请求。
	 * 
	 * wzh增加了注释描述。
	 */
	public void loadResourceDefine(){
		map=new HashMap<>();
		Collection<ConfigAttribute> array;
		ConfigAttribute cfg;
		List<Authority> permissions=authdao.findAll();
		for(Authority permission:permissions){
			array = new ArrayList<>();
			cfg=new SecurityConfig(permission.getName());
			//此处只添加了权限的名字，其实还可以添加更多权限的信息，例如请求方法到ConfigAttribute的集合中去。
			array.add(cfg);
			//用权限的getUrl（）作为map的key，用ConfigAttribute的集合作为value
			map.put(permission.getUrl(), array);
		}
	}
	/*
	 * 此方法是为了判定用户请求的url是否再权限表中，如果在权限表中，则返回给decide方法，
	 * 用来判定用户是否有此权限。如果不在权限表中则放行。
	 * 方法的目的是：确定该请求是否需要进行访问权限的判断，对于需要判断权限的请求，返回resUrl，对于不需要
	 * 进行权限判断的请求，返回Null
	 */
	@Override
	    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
	        if(map ==null) loadResourceDefine();
	        HttpServletRequest request = ((FilterInvocation) object).getHttpRequest();
	        System.out.println(request.getRequestURI());
	        if(request.getRequestURI().indexOf(".js")>-1
	        		||request.getRequestURI().indexOf(".css")>-1
	                ||request.getRequestURI().indexOf("favicon.ico")>-1
	                ||request.getRequestURI().indexOf("qq")>-1) {
	        	return null;
	        }
	        AntPathRequestMatcher matcher;
	        String resUrl;
	        for(Iterator<String> iter = map.keySet().iterator(); iter.hasNext(); ) {
	            resUrl = iter.next();
	            matcher = new AntPathRequestMatcher(resUrl);
	            if(matcher.matches(request)) {
	            	System.out.println(map.get(resUrl));
	            	
	            	Collection<ConfigAttribute> ass=new ArrayList<>();
	            	//将  一些共有的 接口  给定一样的权限
	            	ass.add(new SecurityConfig("allusersok"));
	            	System.out.println(ass);
	            	 if(ass.equals(map.get(resUrl))) {
	            		 return null;
	            	 }
	                return map.get(resUrl);
	            }
	        }
	        System.out.println("------------");
	        //防止有的权限没有在数据库 存储    
	        a.add(new SecurityConfig("usersallno"));
	        return a; //
	    }

	    @Override
	    public Collection<ConfigAttribute> getAllConfigAttributes() {
	        return null;
	    }

	    @Override
	    public boolean supports(Class<?> clazz) {
	        return FilterInvocation.class.isAssignableFrom(clazz);
	    }
	    
}
